import express from 'express'
import { Container } from 'inversify'
import { InversifyExpressServer } from 'inversify-express-utils'
import { globalReqProcMidd } from './middleware/global.reqProc.midd'
import { globalResProcMidd } from './middleware/global.resProc.midd'

/**
 * ## App 配置文件
 * @param container 容器，在 main.ts 中引用类时传入
 * @param server InversifyExpressServer 实例，在 main.ts 中引用类时传入
 *
 * @middList 放置中间件，该类会自动进行注册
 * @relevancyContainer 配置需要关联至 container 实例的对象（暂无自动注册，需要手动配置）
 */
export class AppConfig {
  container: Container
  server: InversifyExpressServer

  /** 中间件列表 */
  middList: any[] = [
    express.json(),
    express.urlencoded({ extended: false }),
    globalReqProcMidd,
    globalResProcMidd
  ]

  constructor(container: Container, server: InversifyExpressServer) {
    this.container = container
    this.server = server
    this.server.setConfig((app: express.Application) => {
      this.middleware(this.middList, app)
      this.relevancyContainer(app)
    })
  }

  /**
   * ### 注册中间件
   * - 根据中间件列表自动循环注册
   */
  private middleware(middList: any[], app: express.Application) {
    middList.forEach(item => {
      app.use(item)
    })
  }

  /**
   * ### 关联 container 实例
   * @param app container 实例
   * - 通过 app.use() 进行对象关联
   */
  relevancyContainer(app: express.Application) { }
}